說到變數及常數,就得提一下宣告/賦值
宣告( Declarations ) : 有點像產生一個容器的感覺,但不一定要給值
let a ; //命名一個變數為 a
賦值 (assign),把右邊的值給左邊的變數
let b = 1 ;
JavaScript 有三種宣告方式,分別是var 、let、const
變數,可以想成就是一個命名的容器,用來保存值,並在程式碼中操作使用,可重複賦值,var可以重複宣告
常數,不能重複指定值,也不能重複宣告
因 var 的作用域可以是全域也可以是函式作為範圍,為了避免環境汙染,自ES6開始引入 const 、 let,const 、 let 作用域是區塊作用域。
作用域就是變數執行的範圍,我自己是想成活動範圍,如果在範圍外呼叫該變數,則無法使用/操作該變數
作用域主要分成兩種類型:Lexical Scope ( 語彙範疇 )、Dynamic Scope ( 動態範疇 ),JavaScript是屬於Lexical Scope ( 語彙範疇 ),被包裹在內層的區塊可以保護自己的變數不被外層取用,相反的,外層區塊的變數還是可以被內層區塊使用 ; 當我們執行一段程式時,JavaScript 引擎會先把整段程式碼看過一次,決定哪些函數可以使用哪些變數,然後才執行函數呼叫,所以JavaScript 的變數作用域是在函數還沒執行前就決定好了。
JavaScript 有三種作用域 : 全局作用域、函式作用域、區塊作用域,區塊作用域就是在兩個大括號中{ } (curly braces)裡面。
說到var 、let、 const,順便說一下提升( hoisting ),var 、let、 const三個都會提升,函式(function)宣告也會提升,這樣的好處可以在函式宣告前就交呼叫它,也可以函式間互相呼叫,而var 、let、 const分別將變數宣告提升到函式及區塊作用域,var初始化為undefined,但let 和const卻有個Temporal Dead Zone(TDZ),如果在提升( hoisting )之後、宣告之前存取的話,會發生錯誤,而為什麼要有這個TDZ呢,第一是使避免和捕獲錯誤更加容易 ,第二是讓const實際上按照它們應該的方式工作。